#include "Date.h"

//获取指定年月的天数
int getMonthDay(int year, int month) {
	assert(month > 0 && month < 13);
	int monthDays[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
		monthDays[2] = 29;
	}
	return monthDays[month];
}

//【缺省构造函数】
Date::Date(int year, int month, int day) 
{
	//检查，规定年份非负，月份和天数要合法
	if (year > 0 && month > 0 && month < 13 && day > 0 && day <= getMonthDay(year, month)) {
		_year = year;
		_month = month;
		_day = day;
	}
	else {
		cout << "初始化的日期不合法。" << endl;
	}
}

//【析构函数】
// 这里日期类的属性不涉及动态开辟的内存，所以不用自己写析构

//【拷贝构造函数】
// 这里日期类的属性不涉及动态开辟的内存，所以不用自己写拷贝构造
//Date(const Date& d);
//{
//	_year = d._year;
//	_month = d._month;
//	_day = d._day;
//}

//【赋值重载】
// 这里日期类的属性不涉及动态开辟的内存，所以不用自己写赋值重载
// d1 = d2; ——>  d1.operator=(d2)
// this就是左操作数
//Date& Date::operator=(const Date& d) {
//	if (this != &d) { //防止自己赋值给自己
//		_year = d._year;
//		_month = d._month;
//		_day = d._day;
//	}
//	return *this;
//}

// ==
bool Date::operator==(const Date& d) {
	return _year == d._year && _month == d._month && _day == d._day;
}

//!=
bool Date::operator!=(const Date& d) {
	return !(*this == d);
}

//>
bool Date::operator>(const Date& d) {
	if (_year > d._year)
		return true;
	else if (_year == d._year && _month > d._month)
		return true;
	else if (_year == d._year && _month == d._month && _day > d._day)
		return true;
	return false;
}

//>=
bool Date::operator>=(const Date& d) {
	return *this > d || *this == d;
}

//<
bool Date::operator<(const Date& d) {
	return !(*this >= d);
}

//<=
bool Date::operator<=(const Date& d) {
	return !(*this > d);
}

// +=
Date& Date::operator+=(int x) {
	if (x < 0) {
		*this -= -x; //复用operator-=()
	}
	else {
		_day += x;
		while (_day > getMonthDay(_year, _month)) {
			// 进位
			_day -= getMonthDay(_year, _month);
			_month++;
			if (_month == 13) {
				_month = 1;
				_year++;
			}
		}
	}
	return *this;
}

// +
Date Date::operator+(int x) {
	Date tmp = *this;
	// Date tmp(*this); // 或者这个

	tmp += x;

	return tmp;
}

//-=
//备注：日期减等一个天数
Date& Date::operator-=(int x) {
	if (x < 0) {
		*this += -x; //复用operator+=()
	}
	else {
		//先减天数
		_day -= x;
		while (_day <= 0) {
			--_month;
			if (_month == 0) {
				_month = 12;
				--_year;
			}
			//向上一月借天数
			_day += getMonthDay(_year, _month);
		}
	}
	return *this;
}

//-
//备注：日期减一个天数
Date Date::operator-(int x) {
	Date tmp(*this);
	tmp -= x;
	return tmp;
}

//-
//备注：日期减日期，得到一个天数
int Date::operator-(const Date& d) {
	Date max = *this;
	Date min = d;
	int flag = 1;
	if (*this < d) {
		max = d;
		min = *this;
		flag = -1;
	}

	int count = 0;
	while (min != max) {
		++min;
		++count;
	}
	
	return count * flag;
}

//前置++
Date& Date::operator++() {
	*this += 1;
	return *this;
}

//后置++
Date Date::operator++(int) {
	Date tmp(*this);
	*this += 1;
	return tmp;
}

Date& Date::operator--() {
	*this -= 1;
	return *this;
}

Date Date::operator--(int) {
	Date tmp(*this);
	*this -= 1;
	return tmp;
}